/**
 * 
 */
package com.nari.heatshare.dao;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.nari.coreframe.dao.hibernate3.IGenericDao;
import com.nari.heatshare.model.IAssignMeter;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResultWithPageCond;

/**
 * 
 * @author Xiaopeng
 * @date 2013-8-18
 */
public interface IAssignMeterDao extends IGenericDao<IAssignMeter, String> {

	/**
	 * 分页查询分配表列表
	 * @param seriousNum 分配表表号(可选)
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-29
	 */
	public ResultWithPageCond<IAssignMeter> queryAssignMeterPage(String seriousNum, 
			String projectUID, String communityUID, String buildingUID, String roomUID, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 通过所属关系查询分配表列表
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @return 若所属关系均不存在，则返回空列表
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-29
	 */
	public List<IAssignMeter> queryAssignMetersByBelongs(String projectUID, String communityUID, 
			String buildingUID, String roomUID) throws Exception;
	
	/**
	 * 通过分配表表号查询分配表实体
	 * @param seriousNum
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-2
	 */
	public IAssignMeter queryMeterBySeriousNum(String seriousNum) throws Exception;
	
	/**
	 * 根据所属热用户信息查询分配表列表
	 * @param seriousNum 分配表表号(可选)
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param heatRoomUID 所属热用户(必填)
	 * 说明：若热用户ID不存在，则返回零结果集
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-4
	 */
	public ResultWithPageCond<IAssignMeter> queryMeterPageByRoomUID(String seriousNum, 
			String projectUID, String communityUID, String buildingUID, String heatRoomUID, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 通过分摊域唯一标识统计分配表的个数
	 * @param shareAreaUID 分摊域唯一标识(必填)
	 * @param ifMeasureCharge 是否参与计量收费
	 * 说明：1:不参与		2:参与
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public long countMeterNumByAreaUID(String shareAreaUID, 
			Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 根据散热器唯一标识查询与其一一对应的分配表信息
	 * @param heatSinkID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-6
	 */
	public IAssignMeter queryMeterBySinkUID(String heatSinkID) throws Exception;
	
	/**
	 * 通过所属关系统计分配表的个数
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-23
	 */
	public int countMeterSumByBelongs(String projectUID, String communityUID, 
			String buildingUID, String roomUID) throws Exception;
	
	/**
	 * 通过集中器号查询所属分配表个数
	 * @param concentratorNo
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-29
	 */
	public int countMeterSumByConcentratorNo(String concentratorNo) throws Exception;
	
	/**
	 * 通过集中器唯一标识查询所属分配表个数
	 * @param concentratorUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-3-17
	 */
	public int countMeterSumByConcentratorID(String concentratorUID) throws Exception;
	
	/**
	 * 通过分配表表号查询隶属于某一热用户的分配表
	 * @param seriousNum
	 * @param roomUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-1-22
	 */
	public IAssignMeter queryMeterInfoBySeriousNum(String seriousNum, String roomUID) throws Exception;
	
	/**
	 * 统计不隶属于某一热用户的分配表个数
	 * @param assignMeter
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-1-22
	 */
	public int countMeterNumBySeriousNum(String seriousNum, String roomUID) throws Exception;
	
	/**
	 * 通过集中器唯一标识查询所属分配表列表
	 * @param concentratorUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-3-17
	 */
	public List<IAssignMeter> queryMetersByConcentratorID(String concentratorUID) throws Exception;
	
	/**
	 * 统计相同分配表表号的分配表数量，避免系统录入相同分配表表号的分配表信息
	 * @param seriousNum
	 * @param assignMeterUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-7-28
	 */
	public int countBySeriousNum(String seriousNum, String assignMeterUID) throws Exception;

	public abstract ArrayList<String> queryAssignMeterNo(String seriousNum, String projectUID,
			String communityUID, String buildingUID, String roomUID) throws Exception;
}
